
package com.kt.learn1;
/**
 * Kotlin 基本语法和变量类型示例
 */

fun main() {
    // 1. 基本语法
    // 注释：Kotlin 支持单行注释（//）和多行注释（/* */）
    /*
    这是一个多行注释
    可以跨越多行
     */
    println("Kotlin version: ${kotlin.KotlinVersion.CURRENT}")

    // 打印输出：使用 println() 函数
    println("Hello, Kotlin!")

    // 2. 变量声明
    // 使用 val 声明不可变变量（相当于 Java 的 final）
    val name1: String = "Alice"
    println("Name: $name1") // 输出：Name: Alice

    // 使用 var 声明可变变量
    var age: Int = 25
    age = 26
    println("Age: $age") // 输出：Age: 26

    // 类型推断：Kotlin 可以自动推断变量类型，所以可以省略显式类型声明
    val message = "Hello, Kotlin!"
    println(message) // 输出：Hello, Kotlin!

    // 3. 基本数据类型
    // Kotlin 的基本数据类型包括：
    // - Int：整数类型
    // - Long：长整数类型
    // - Float：单精度浮点数类型
    // - Double：双精度浮点数类型
    // - Boolean：布尔类型
    // - Char：字符类型
    // - String：字符串类型

    // 整数类型
    val intValue: Int = 42
    println("Int: $intValue") // 输出：Int: 42

    // 长整数类型
    val longValue: Long = 1234567890123L
    println("Long: $longValue") // 输出：Long: 1234567890123

    // 浮点数类型
    val floatValue: Float = 3.14f
    println("Float: $floatValue") // 输出：Float: 3.14

    val doubleValue: Double = 3.141592653589793
    println("Double: $doubleValue") // 输出：Double: 3.141592653589793

    // 布尔类型
    val booleanValue: Boolean = true
    println("Boolean: $booleanValue") // 输出：Boolean: true

    // 字符类型
    val charValue: Char = 'A'
    println("Char: $charValue") // 输出：Char: A

    // 字符串类型
    val stringValue: String = "Hello, Kotlin!"
    println("String: $stringValue") // 输出：String: Hello, Kotlin!

    // 4. 数组和集合
    // 数组：使用 arrayOf() 函数创建数组
    val numbers = arrayOf(1, 2, 3, 4, 5)
    println("Numbers: ${numbers.joinToString()}") // 输出：Numbers: 1, 2, 3, 4, 5

    // 集合：Kotlin 提供了 List、Set 和 Map 等集合类型
    val list = listOf("Apple", "Banana", "Cherry")
    println("List: ${list.joinToString()}") // 输出：List: Apple, Banana, Cherry

    val set = setOf("Red", "Green", "Blue")
    println("Set: ${set.joinToString()}") // 输出：Set: Red, Green, Blue

    val map = mapOf("Key1" to "Value1", "Key2" to "Value2")
    println("Map: ${map.entries.joinToString { "${it.key}=${it.value}" }}") // 输出：Map: Key1=Value1, Key2=Value2

    // 5. 控制流
    // if 表达式
    val number = 10
    val result = if (number % 2 == 0) {
        "Even"
    } else {
        "Odd"
    }
    println("Number $number is $result") // 输出：Number 10 is Even

    // when 表达式（类似于 switch）
    val dayOfWeek = 3
    val dayName = when (dayOfWeek) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        7 -> "Sunday"
        else -> "Invalid day"
    }
    println("Day $dayOfWeek is $dayName") // 输出：Day 3 is Wednesday

    // for 循环
    println("Numbers from 1 to 5:")
    for (i in 1..5) {
        print("$i ") // 输出：1 2 3 4 5
    }
    println()

    // while 循环
    println("Countdown from 5 to 1:")
    var count = 5
    while (count >= 1) {
        print("$count ")
        count--
    }
    println()

    // 6. 函数
    // 声明函数
    fun add(a: Int, b: Int): Int {
        return a + b
    }

    // 单表达式函数
    fun subtract(a: Int, b: Int) = a - b

    // 调用函数
    println("Addition: ${add(5, 3)}") // 输出：Addition: 8
    println("Subtraction: ${subtract(5, 3)}") // 输出：Subtraction: 2

    // 7. 类和对象
    // 声明类
    class Person(val name: String, var age: Int) {
        // 成员函数
        fun introduce() {
            println("My name is $name and I'm $age years old.")
        }
    }

    // 创建对象
    val person = Person("Alice", 25)
    person.introduce() // 输出：My name is Alice and I'm 25 years old.

    // 8. 扩展函数
    fun String.repeatTimes(times: Int): String {
        return this.repeat(times)
    }

    println("Kotlin".repeatTimes(3)) // 输出：KotlinKotlinKotlin

    // 9. 数据类
    data class User(val id: Int, val name: String)

    val user = User(1, "Alice")
    println(user) // 输出：User(id=1, name=Alice)

    // 10. 解构声明
    val (id, name) = user
    println("ID: $id, Name: $name") // 输出：ID: 1, Name: Alice

    // 11. Lambda 表达式
    val sumLambda: (Int, Int) -> Int = { a, b -> a + b }
    println("Sum using lambda: ${sumLambda(5, 3)}") // 输出：Sum using lambda: 8

    // 12. 高阶函数
    fun calculate(operation: (Int, Int) -> Int, a: Int, b: Int): Int {
        return operation(a, b)
    }

    println("Multiplication: ${calculate({ a, b -> a * b }, 5, 3)}") // 输出：Multiplication: 15
}